Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

280
Views
¿Qué es la inspección "Agregar atributo #[Puro]" en la comprobación de PhpStorm?

Tengo una clase FormRequest muy simple en un proyecto de Laravel. Dos métodos, los cuales devuelven una matriz simple que está parcialmente poblada por un método, pero el IDE los trata de manera diferente.

 <?php namespace App\Http\Requests; class VerifyPhoneNumber extends FormRequest { use Support\ValidatesPhoneNumbers; public function authorize(): bool { return true; } public function rules(): array { return [ "phone_number" => $this->getPhoneNumberRules(), "verify_code" => ["required", "numeric", "max:999999"], ]; } public function messages(): array { return [ "phone_number.regex" => $this->getPhoneNumberMessage(), ]; } }

Y los métodos de rasgos muy básicos:

 <?php namespace App\Http\Requests\Support; trait ValidatesPhoneNumbers { protected function getPhoneNumberMessage(): string { return __("Some localized error message"); } protected function getPhoneNumberRules(): array { return ["regex:/^\+?1?[2-9][0-9]{5,14}$/", "max:16"]; } }

Lo que me desconcierta es que la inspección del IDE se queja de que debería agregar el atributo JetBrains\PhpStorm\Pure al método rules() , pero no al método de messages() .

Los comentarios en la definición de clase dicen:

El atributo marca la función que no tiene impacto en el estado del programa o los parámetros pasados utilizados después de la ejecución de la función. Esto significa que una llamada de función que se resuelve en dicha función se puede eliminar de forma segura si el resultado de la ejecución no se usa en el código posteriormente.

Eso realmente no me da ninguna pista de por qué trata estos dos métodos de manera diferente. Si entiendo la segunda oración correctamente, cuando el resultado de un método "puro" no se usa, el IDE marcará el uso del método como no usado y recomendará su eliminación.

¿Cuál es la lógica utilizada para determinar cuándo se necesita este atributo?

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

El método rules() tiene un resultado fijo (mejor dicho "sin efectos secundarios" ): solo usa valores fijos. Claro, llama a getPhoneNumberRules() desde un rasgo pero también devuelve una matriz fija (siempre la misma). No realiza cambios en ningún otro lugar (estado interno o almacenamiento externo).

El método de messages() llama a un método de un rasgo que llama a __() para obtener un mensaje traducido... que puede provenir de una fuente diferente (una base de datos, un archivo) y, por lo tanto, potencialmente puede generar excepciones si un almacenamiento (archivo/base de datos ) no es legible. El IDE no sabe con certeza si __() realiza cambios en un archivo/base de datos; no está anotado como puro y PhpStorm no puede tomar tal decisión a partir de los métodos que utiliza.


PD : si esta inspección le molesta (lo que puedo entender), le sugiero que simplemente la ignore y reduzca su gravedad en Configuración de PhpStorm a "Sin resaltar, solo corregir" ( Settings (Preferences on macOS) | Editor | Inspections | PHP | Attributes | '#[Pure]' attribute can be added )

over 4 years ago · Santiago Trujillo Report

0

Si una función solo depende de otras funciones puras, entonces también es pura. Dado que getPhoneNumberRules() solo devuelve una matriz fija, es puro, por lo que rules() también es puro.

Pero messages() llama a getPhoneNumberMessage() , que llama a la función __() que puede devolver un mensaje localizado diferente si cambia el estado de la ubicación, por lo que no es puro.

over 4 years ago · Santiago Trujillo Report

0

Utilice este atributo para funciones que no produzcan efectos secundarios. Todas estas funciones internas de PHP ya están marcadas en PhpStorm.

 #[Pure] function compare(Foo $a, Foo $b): int { return $a->a <=> $b->b; }

Fuente: https://github.com/JetBrains/phpstorm-attributes#pure

Como esta función solo hace algo por sí misma, se la puede llamar función #[Pura] y eso lo sabes a través de PhpStorm.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!